home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / RUN.TST / GENCHISQ.C < prev    next >
C/C++ Source or Header  |  1996-03-30  |  3KB  |  100 lines

  1. /* ============ */
  2. /* GenChiSq.c    */
  3. /* ============ */
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <defcodes.h>
  7. #include <mconf.h>
  8. #include <miscdefs.h>
  9. #include <rundefs.h>
  10.  
  11. /* ------------------- */
  12. /* FUNCTION PROTOTYPES */
  13. /* ------------------- */
  14. # undef F
  15. # if defined(__STDC__) || defined(__PROTO__)
  16. #    define  F( P )  P
  17. # else
  18. #    define  F( P )  ()
  19. # endif
  20.  
  21. /* INDENT OFF */
  22. extern    double    CalcChiSq F((struct RunDataStru *));
  23. extern    void    GenerateChiSquareData F((struct RunDataStru *));
  24.  
  25. # undef F
  26. /* INDENT ON */
  27.  
  28. /* ==================================================================== */
  29. /* GenerateChiSquareData - Produces Array of Chi-Square Probabilities    */
  30. /* ==================================================================== */
  31. void
  32. GenerateChiSquareData(RUN_DATA_STRU * RunData)
  33. {
  34.     int     k;
  35.  
  36.     for (k = 0; k < NUM_PROBS; ++k)
  37.     {
  38.     /* --------------------------------- */
  39.     /* Generate Block of Unique Variates */
  40.     /* --------------------------------- */
  41.     GenRunData(RunData);
  42.  
  43.     P(printf("Status of Call to GenRunData(): %s\n\n",
  44.         (RunData->CallStatus == TRUE) ? "SUCCESS" : "FAILURE"));
  45.  
  46.     if (RunData->CallStatus != TRUE)
  47.     {
  48.         fprintf(stderr,
  49.         "\nGenerateChiSquareData: "
  50.         "Generator Failure in GenRunData().\n");
  51.         break;
  52.     }
  53.     /* ------------- */
  54.     /* Count Runs Up */
  55.     /* ------------- */
  56.     CountRuns(RunData);
  57.  
  58.     /* -------------------------------- */
  59.     /* Calculate Chi-square Probability */
  60.     /* -------------------------------- */
  61.     RunData->ChiSqProb[k] = CalcChiSq(RunData);
  62.  
  63.     fprintf(stderr, "\rPass %3d (of %d), %8ld  Total Random Numbers",
  64.         k+1, NUM_PROBS, RunData->TotVariates);
  65.     }
  66. }
  67. /* ==================================================================== */
  68. /* CalcChiSq - Calculates Chi-square statistic, Returns Probability        */
  69. /* ==================================================================== */
  70. double
  71. CalcChiSq(RUN_DATA_STRU *RunData)
  72. {
  73.     UINT i;
  74.     double  ChiSqProb, ChiSqVal = 0;
  75.  
  76.     static
  77.     double  RunProb[MAX_RUN_CATS] =
  78.     { 1./2., 1./3., 1./8., 1./30., 1./144., 1./720. };
  79.  
  80.     for (i = 1; i <= MAX_RUN_CATS; ++i)
  81.     {
  82.     double    Expected;
  83.  
  84.     Expected = (double)RunData->RunCtrs[0] * RunProb[i-1];
  85.     ChiSqVal += SQR((double)RunData->RunCtrs[i]) / Expected;
  86.     P(printf("%5u:\t%5ld%10.2f%9.3f%%\n",
  87.         i, RunData->RunCtrs[i], Expected, 100*RunProb[i-1]));
  88.     }
  89.  
  90.     ChiSqVal -= (double)RunData->RunCtrs[0];
  91.     ChiSqProb =    chdtr(DEG_FREE, ChiSqVal);
  92.  
  93.     P(printf("Total:\t%5ld   Number of Runs This Pass\n\n",
  94.     RunData->RunCtrs[0]));
  95.     P(printf("%6.3f   Chi-Square for This Pass\n", ChiSqVal));
  96.     P(printf("%6.2f%%  Chi-Square Probability\n\n", ChiSqProb*100));
  97.  
  98.     return (ChiSqProb);
  99. }
  100.